/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.istia.gesstages.dao.db;

import fr.istia.gesstages.dao.IDaoApply;
import fr.istia.gesstages.exception.PortailException;
import fr.istia.gesstages.jpa.Apply;
import fr.istia.gesstages.jpa.Offer;
import fr.istia.gesstages.jpa.User;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;

/**
 * @date 22/11/2011
 * @author Cédric Moreau
 */
@Transactional
public class DaoApplyDB implements IDaoApply {

    @PersistenceContext
    private EntityManager em;

    public Apply create(Apply apply) {
        try {
            em.persist(apply);
            return apply;
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la création de la candidature", e);
        }
    }

    public Apply update(Apply apply) {
        try {
            return em.merge(apply);
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la mise à jour de la candidature n°" + apply.getId(), e);
        }
    }

    public void delete(Apply apply) {
        try {
            em.remove(em.merge(apply));
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la suppression de la candidature n°" + apply.getId(), e);
        }
    }

    public Apply findBy(Offer offer, User student) {
        try {
            return (Apply) em.createQuery("select a from Apply a WHERE a.stage.id = :idOffer AND a.user.id = :idUser").setParameter("idOffer", offer.getId()).setParameter("idUser", student.getId()).getSingleResult();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la récupération de la candidature d'offre n°" + offer.getId() + " et d'utilisateur n°" + student.getId() + "", e);
        }
    }

    public List<Apply> findByOffer(Offer offer) {
        try {
            return em.createQuery("select c from Apply c where c.stage.id = " + offer.getId()).getResultList();
        } catch (Exception e) {
            throw new PortailException(" Erreur lors de la recuperation des candidatures de l'offre n°" + offer.getId(), e);
        }
    }

    public List<Apply> findByUser(User student) {
        try {
            return em.createQuery("select a from Apply a where a.user.id = " + student.getId()).getResultList();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la recuperation des candidatures de l'utilisateur '" + student.getLogin() + "'", e);
        }
    }

    public void deleteAll() {
        try {
            em.createQuery("DELETE FROM Apply a").executeUpdate();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la suppression de toutes les candidatures", e);
        }
    }

    public void close() {
    }

    public List<Apply> findAll() {
        try {
            return em.createQuery("select a from Apply a").getResultList();
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la recuperation des toutes les candidatures", e);
        }
    }

    public Apply findBy(int id) {
        try {
            return em.find(Apply.class, id);
        } catch (Exception e) {
            throw new PortailException("Erreur lors de la recuperation de la candidature n°" + id, e);
        }
    }
}
